//: C20:WordCount.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 1999
// Copyright notice in Copyright.txt
//{L} StreamTokenizer
// Count occurrences of words using a map
#include "StreamTokenizer.h"
#include "../require.h"
#include <string>
#include <map>
#include <iostream>
#include <fstream>
using namespace std;

class Count
{
    int i;
public:
    Count() : i(0) {}
    void operator++(int) {
        i++;        // Post-increment
    }
    int& val() {
        return i;
    }
};

typedef map<string, Count> WordMap;
typedef WordMap::iterator WMIter;

int main(int argc, char* argv[])
{
    requireArgs(argc, 1);
    ifstream in(argv[1]);
    assure(in, argv[1]);
    StreamTokenizer words(in);
    WordMap wordmap;
    string word;
    while ((word = words.next()).size() != 0)
        wordmap[word]++;
    for (WMIter w = wordmap.begin();
            w != wordmap.end(); w++)
        cout << (*w).first << ": "
             << (*w).second.val() << endl;
} ///:~
